import {AppDataSource} from './data.source'
import {Category} from './entity/Category'

// 树形结构
/**
 * @Tree 是TypeORM中用于定义树形结构实体的装饰器。树形结构常用于表示层级关系的数据，例如文件目录/组织结构/分类等。
 * TypeORM提供了多种树形结构来处理不同的场景，如闭包表/嵌套集/物化路径和父子关系
 * */
AppDataSource.initialize().then(async () => {
    // 树形结构的实体，使用getTreeRepository获取仓库
    const categoryRepository = AppDataSource.getTreeRepository(Category)

    // 保存根节点
    const root = new Category();
    root.name = 'root';
    await categoryRepository.save(root);

    // 创建子节点
    const child1 = new Category();
    child1.name = 'root-child1';
    child1.parent = root;
    await categoryRepository.save(child1);

    // 创建子节点
    const child2 = new Category();
    child2.name = 'root-child2';
    child2.parent = root;
    await categoryRepository.save(child2);

    // 床架孙子节点
    const son1 = new Category();
    son1.name = 'root-child1-son1';
    son1.parent = child1;
    await categoryRepository.save(son1);

    // 查询所有的数据
    const find = await categoryRepository.find();
    console.log(find);

    // 查询分类树
    const allCategories = await categoryRepository.findTrees();
    console.log(allCategories);

    // 查询根节点
    const findRoot = await categoryRepository.findRoots();
    console.log(findRoot);

    // 查询祖先
    const findAncestors = await categoryRepository.findAncestors(son1);
    console.log(findAncestors);

    // 查询祖先树
    const findAncestorsTree = await categoryRepository.findAncestorsTree(son1);
    console.log(findAncestorsTree);

    // 查询后代
    const findDescendants = await categoryRepository.findDescendants(child1);
    console.log(findDescendants)

    // 查询后代树
    const findDescendantsTree = await categoryRepository.findDescendantsTree(child1);
    console.log(findDescendantsTree)

    // 查询祖先数量
    const countAncestors = await categoryRepository.countAncestors(son1);
    console.log(countAncestors);

    // 查询后代数量
    const countDescendants = await categoryRepository.countDescendants(child1);
    console.log(countDescendants);
}).finally(() => {
    process.exit();
})